from django.shortcuts import render
import pandas as pd
import numpy as np
from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Radar, Scatter
from pyecharts.commons.utils import JsCode
from jinja2 import Environment, FileSystemLoader
from pyecharts.globals import CurrentConfig, ThemeType
import json
import random
from django.http import JsonResponse
from django.views import View


class PersonalityAnalysisView(View):
    """音乐喜好分析与社会洞察视图"""

    def get(self, request, *args, **kwargs):
        # 模拟数据 - 实际应用中应从数据库或API获取
        age_groups = ['18-24岁', '25-34岁', '35-44岁', '45-54岁', '55岁以上']
        music_genres = ['流行音乐', '摇滚', '古典', '电子音乐', '民谣', '嘻哈']

        # 生成不同年龄段的音乐喜好雷达图
        radar_data = [
            [80, 65, 30, 85, 70, 60],  # 18-24岁
            [70, 60, 35, 70, 65, 55],  # 25-34岁
            [60, 45, 60, 40, 75, 30],  # 35-44岁
            [40, 30, 75, 25, 65, 15],  # 45-54岁
            [30, 20, 85, 15, 60, 10],  # 55岁以上
        ]

        radar_chart = (
            Radar(init_opts=opts.InitOpts(theme=ThemeType.INFOGRAPHIC, width="100%", height="100%"))
            .add_schema(
                schema=[
                    opts.RadarIndicatorItem(name=genre, max_=100) for genre in music_genres
                ],
                splitarea_opt=opts.SplitAreaOpts(
                    is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=0.1)
                ),
            )
            .add("18-24岁", [radar_data[0]], color="#4F7FF7",
                 linestyle_opts=opts.LineStyleOpts(width=2))
            .add("25-34岁", [radar_data[1]], color="#1DB08C",
                 linestyle_opts=opts.LineStyleOpts(width=2))
            .add("35-44岁", [radar_data[2]], color="#F2C567",
                 linestyle_opts=opts.LineStyleOpts(width=2))
            .add("45-54岁", [radar_data[3]], color="#F25757",
                 linestyle_opts=opts.LineStyleOpts(width=2))
            .add("55岁以上", [radar_data[4]], color="#A34FD0",
                 linestyle_opts=opts.LineStyleOpts(width=2))
            .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
            .set_global_opts(
                title_opts=opts.TitleOpts(title=""),
                legend_opts=opts.LegendOpts(selected_mode='multiple')
            )
        )

        # 性别音乐偏好差异柱状图
        gender_bar = (
            Bar(init_opts=opts.InitOpts(theme=ThemeType.INFOGRAPHIC, width="100%", height="100%"))
            .add_xaxis(music_genres)
            .add_yaxis("男性", [75, 68, 45, 80, 60, 70], category_gap="50%")
            .add_yaxis("女性", [82, 52, 65, 65, 80, 35], category_gap="50%")
            .set_global_opts(
                title_opts=opts.TitleOpts(title=""),
                xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=15)),
                yaxis_opts=opts.AxisOpts(name="喜好程度"),
                legend_opts=opts.LegendOpts()
            )
        )

        # 社交活跃度与音乐偏好关系折线图
        social_activity = ['低社交活跃', '中等社交活跃', '高社交活跃', '极高社交活跃']
        social_data = {
            '流行音乐': [50, 65, 80, 90],
            '摇滚': [45, 60, 75, 80],
            '古典': [70, 65, 45, 35],
            '电子音乐': [35, 55, 75, 85],
        }

        social_line = (
            Line(init_opts=opts.InitOpts(theme=ThemeType.INFOGRAPHIC, width="100%", height="100%"))
            .add_xaxis(social_activity)
            .add_yaxis("流行音乐", social_data['流行音乐'], is_smooth=True)
            .add_yaxis("摇滚", social_data['摇滚'], is_smooth=True)
            .add_yaxis("古典", social_data['古典'], is_smooth=True)
            .add_yaxis("电子音乐", social_data['电子音乐'], is_smooth=True)
            .set_global_opts(
                title_opts=opts.TitleOpts(title=""),
                yaxis_opts=opts.AxisOpts(
                    name="喜好程度",
                    type_="value",
                    min_=30,
                    max_=100,
                ),
                legend_opts=opts.LegendOpts(selected_mode='multiple')
            )
        )

        # 音乐喜好历史变迁折线图
        years = ['2000年', '2005年', '2010年', '2015年', '2020年', '2023年']
        trend_data = {
            '流行音乐': [60, 65, 75, 80, 85, 80],
            '摇滚': [80, 75, 65, 60, 55, 60],
            '古典': [45, 40, 35, 30, 35, 45],
            '电子音乐': [30, 35, 45, 60, 70, 75],
        }

        trend_line = (
            Line(init_opts=opts.InitOpts(theme=ThemeType.INFOGRAPHIC, width="100%", height="100%"))
            .add_xaxis(years)
            .add_yaxis("流行音乐", trend_data['流行音乐'], is_smooth=True,
                       markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]))
            .add_yaxis("摇滚", trend_data['摇滚'], is_smooth=True,
                       markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="min")]))
            .add_yaxis("古典", trend_data['古典'], is_smooth=True)
            .add_yaxis("电子音乐", trend_data['电子音乐'], is_smooth=True,
                       markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]))
            .set_global_opts(
                title_opts=opts.TitleOpts(title=""),
                tooltip_opts=opts.TooltipOpts(trigger="axis"),
                legend_opts=opts.LegendOpts(selected_mode='multiple')
            )
        )

        # 音乐喜好与个性特征相关性散点图
        personality_traits = ['外向性', '开放性', '责任心', '情绪稳定性', '友善性']
        scatter_data = []

        # 模拟数据点
        np.random.seed(42)
        for genre in music_genres[:4]:  # 选取4种音乐类型
            data = []
            for trait in personality_traits:
                # 随机生成相关性数据点 (x: 个性特征强度, y: 音乐偏好强度)
                for _ in range(20):
                    x = random.uniform(0, 100)

                    # 不同音乐类型与个性特征有不同相关性
                    if genre == '流行音乐' and trait == '外向性':
                        y = 0.7 * x + random.uniform(10, 30)
                    elif genre == '古典' and trait == '开放性':
                        y = 0.65 * x + random.uniform(15, 35)
                    elif genre == '摇滚' and trait == '情绪稳定性':
                        y = -0.5 * x + random.uniform(60, 90)
                    else:
                        y = 0.3 * x + random.uniform(20, 60)

                    y = min(max(y, 0), 100)  # 确保y的值在0-100之间
                    data.append([x, y, trait])

            scatter_data.append({"name": genre, "data": data})

        correlation_scatter = (
            Scatter(init_opts=opts.InitOpts(theme=ThemeType.INFOGRAPHIC, width="100%", height="100%"))
            .add_xaxis([])
            .set_global_opts(
                title_opts=opts.TitleOpts(title=""),
                xaxis_opts=opts.AxisOpts(
                    type_="value",
                    name="个性特征强度",
                    min_=0,
                    max_=100,
                ),
                yaxis_opts=opts.AxisOpts(
                    type_="value",
                    name="音乐偏好强度",
                    min_=0,
                    max_=100,
                ),
                tooltip_opts=opts.TooltipOpts(
                    formatter=JsCode(
                        "function(params) {"
                        "    return '音乐类型: ' + params.seriesName + '<br/>' +"
                        "           '个性特征: ' + params.value[2] + '<br/>' +"
                        "           '个性特征强度: ' + params.value[0].toFixed(1) + '<br/>' +"
                        "           '音乐偏好强度: ' + params.value[1].toFixed(1);"
                        "}"
                    )
                ),
                legend_opts=opts.LegendOpts(selected_mode='multiple')
            )
        )

        # 添加散点数据
        for item in scatter_data:
            correlation_scatter.add_yaxis(
                series_name=item["name"],
                y_axis=item["data"],
                symbol_size=10,
                label_opts=opts.LabelOpts(is_show=False),
            )

        # 社会文化洞察
        social_insights = [
            {
                "title": "数字时代的音乐偏好变迁",
                "content": "研究表明，随着流媒体平台的普及，年轻一代更倾向于跨流派的音乐探索，而不再局限于单一风格。这种变化反映了数字时代对音乐消费方式的深刻影响。"
            },
            {
                "title": "社交媒体对音乐传播的影响",
                "content": "社交媒体平台已成为音乐发现和传播的重要渠道，特别是对高社交活跃度群体而言。短视频平台上的音乐传播速度往往超过传统媒体渠道，并能迅速形成流行趋势。"
            },
            {
                "title": "音乐选择与社会认同",
                "content": "音乐选择不仅是个人偏好的体现，也是社会群体认同的重要标志。研究发现，特定音乐类型的爱好者往往形成独特的社交圈层和共同的价值观念。"
            },
            {
                "title": "跨文化音乐交流的增长趋势",
                "content": "全球化和数字平台的发展促进了跨文化音乐的交流与融合。越来越多的听众开始接触并欣赏来自不同文化背景的音乐，推动了多元音乐生态的形成。"
            }
        ]

        context = {
            'radar_chart': radar_chart.render_embed(),
            'gender_bar': gender_bar.render_embed(),
            'social_line': social_line.render_embed(),
            'trend_line': trend_line.render_embed(),
            'correlation_scatter': correlation_scatter.render_embed(),
            'social_insights': social_insights,
            'navname': 'music'
        }

        return render(request, 'charts/personality_analysis.html', context)


# 为了兼容性保留原函数，但实际使用类视图
def personality_analysis(request):
    view = PersonalityAnalysisView()
    return view.get(request)
